package com.gun.dynamicproxy;

import java.lang.reflect.Proxy;

public class JDKDynamicProxy {

    // 声明被代理的对象
    private Person person;

    //构造函数
    public JDKDynamicProxy(Person person) {
        this.person = person;
    }

    //获取代理对象，俗话说：就是找个秘书帮你去干活。
    public Object getTarget(){
        // 帮谁代理：person.getClass().getClassLoader(), 帮person类型找。
        // new Handler(person) 处理器类,要实现接口 InvocationHandler
        // 写this ，这个类要实现InvocationHandler 接口，重写方法 invoke


        // 1、会产生一段字符串 的 代理类的源码
        // 2、把这个字符 输出到一个.java($Proxy.java)的文件中
        // 3、会把这个($Proxy.java)动态编译为一个$Proxy.class
        // 4、会通过一个类加载器把这个$Proxy.class加载到JVM中
        // 5、Class.foranme("xxxxxx").newInstance 反射实例化这个对象proxyObject
        // 6、直接产生字节码在内存中，然后加载到JVM当中。
        Object proxyInstance = Proxy.newProxyInstance(person.getClass().getClassLoader(),
                person.getClass().getInterfaces(),
                new Handler(person));// 初始化代理对象实例化。

        System.out.println("代理对象：===="+proxyInstance);
        return proxyInstance;
    }

//  将这个方法到了一个类中去了
//    @Override
//    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        System.out.println("对原方法进行了前置增强");
//        //原方法执行
//        Object invoke = method.invoke(person, args);
//        System.out.println("对原方法进行了后置增强");
//        return invoke;
//    }

}
